Yearly History Calendar-Aligned Price up to 10 Years)Overview
This indicator helps traders compare historical price patterns from the past 10 calendar years with the current price action. It overlays translucent lines (polylines) for each year’s price data on the same calendar dates, providing a visual reference for recurring trends. A dynamic table at the top of the chart summarizes the active years, their price sources, and history retention settings.
Key Features
Historical Projections
Displays price data from the last 10 years (e.g., January 5, 2023 vs. January 5, 2024).
Price Source Selection
Choose from Open, Low, High, Close, or HL2 ((High + Low)/2) for historical alignment.
The selected source is shown in the legend table.
Bulk Control Toggles
Show All Years : Display all 10 years simultaneously.
Keep History for All : Preserve historical lines on year transitions.
Hide History for All : Automatically delete old lines to update with current data.
Individual Year Settings
Toggle visibility for each year (-1 to -10) independently.
Customize color and line width for each year.
Control whether to keep or delete historical lines for specific years.
Visual Alignment Aids
Vertical lines mark yearly transitions for reference.
Polylines are semi-transparent for clarity.
Dynamic Legend Table
Shows active years, their price sources, and history status (On/Off).
Updates automatically when settings change.
How to Use
Configure Settings
Projection Years : Select how many years to display (1–10).
Price Source : Choose Open, Low, High, Close, or HL2 for historical alignment.
History Precision : Set granularity (Daily, 60m, or 15m).
Daily (D) is recommended for long-term analysis (covers 10 years).
60m/15m provides finer precision but may only cover 1–3 years due to data limits.
Adjust Visibility & History
Show Year -X : Enable/disable specific years for comparison.
Keep History for Year -X : Choose whether to retain historical lines or delete them on new year transitions.
Bulk Controls
Show All Years : Display all 10 years at once (overrides individual toggles).
Keep History for All / Hide History for All : Globally enable/disable history retention for all years.
Customize Appearance
Line Width : Adjust polyline thickness for better visibility.
Colors : Assign unique colors to each year for easy identification.
Interpret the Legend Table
The table shows:
Year : Label (e.g., "Year -1").
Source : The selected price type (e.g., "Close", "HL2").
Keep History : Indicates whether lines are preserved (On) or deleted (Off).
Tips for Optimal Use
Use Daily Timeframes for Long-Term Analysis :
Daily (1D) allows 10+ years of data. Smaller timeframes (60m/15m) may have limited historical coverage.
Compare Recurring Patterns :
Look for overlaps between historical polylines and current price to identify potential support/resistance levels.
Customize Colors & Widths :
Use contrasting colors for years you want to highlight. Adjust line widths to avoid clutter.
Leverage Global Toggles :
Enable Show All Years for a quick overview. Use Keep History for All to maintain continuity across transitions.
Example Workflow
Set Up :
Select Projection Years = 5.
Choose Price Source = Close.
Set History Precision = 1D for long-term data.
Customize :
Enable Show Year -1 to Show Year -5.
Assign distinct colors to each year.
Disable Keep History for All to ensure lines update on year transitions.
Analyze :
Observe how the 2023 close prices align with 2024’s price action.
Use vertical lines to identify yearly boundaries.
Common Questions
Why are some years missing?
Ensure the chart has sufficient historical data (e.g., daily charts cover 10 years, 60m/15m may only cover 1–3 years).
How do I update the data?
Adjust the Price Source or toggle years/history settings. The legend table updates automatically.
Wyszukaj w skryptach " TABLE "
Cointegration Buy and Sell Signals [EdgeTerminal]The Cointegration Buy And Sell Signals is a sophisticated technical analysis tool to spot high-probability market turning points — before they fully develop on price charts.
Most reversal indicators rely on raw price action, visual patterns, or basic and common indicator logic — which often suffer in noisy or trending markets. In most cases, they lag behind the actual change in trend and provide useless and late signals.
This indicator is rooted in advanced concepts from statistical arbitrage, mean reversion theory, and quantitative finance, and it packages these ideas in a user-friendly visual format that works on any timeframe and asset class.
It does this by analyzing how the short-term and long-term EMAs behave relative to each other — and uses statistical filters like Z-score, correlation, volatility normalization, and stationarity tests to issue highly selective Buy and Sell signals.
This tool provides statistical confirmation of trend exhaustion, allowing you to trade mean-reverting setups. It fades overextended moves and uses signal stacking to reduce false entries. The entire indicator is based on a very interesting mathematically grounded model which I will get into down below.
Here’s how the indicator works at a high level:
EMAs as Anchors: It starts with two Exponential Moving Averages (EMAs) — one short-term and one long-term — to track market direction.
Statistical Spread (Regression Residuals): It performs a rolling linear regression between the short and long EMA. Instead of using the raw difference (short - long), it calculates the regression residual, which better models their natural relationship.
Normalize the Spread: The spread is divided by historical price volatility (ATR) to make it scale-invariant. This ensures the indicator works on low-priced stocks, high-priced indices, and crypto alike.
Z-Score: It computes a Z-score of the normalized spread to measure how “extreme” the current deviation is from its historical average.
Dynamic Thresholds: Unlike most tools that use fixed thresholds (like Z = ±2), this one calculates dynamic thresholds using historical percentiles (e.g., top 10% and bottom 10%) so that it adapts to the asset's current behavior to reduce false signals based on market’s extreme volatility at a certain time.
Z-Score Momentum: It tracks the direction of the Z-score — if Z is extreme but still moving away from zero, it's too early. It waits for reversion to start (Z momentum flips).
Correlation Check: Uses a rolling Pearson correlation to confirm the two EMAs are still statistically related. If they diverge (low correlation), no signal is shown.
Stationarity Filter (ADF-like): Uses the volatility of the regression residual to determine if the spread is stationary (mean-reverting) — a key concept in cointegration and statistical arbitrage. It’s not possible to build an exact ADF filter in Pine Script so we used the next best thing.
Signal Control: Prevents noisy charts and overtrading by ensuring no back-to-back buy or sell signals. Each signal must alternate and respect a cooldown period so you won’t be overwhelmed and won’t get a messy chart.
Important Notes to Remember:
The whole idea behind this indicator is to try to use some stat arb models to detect shifting patterns faster than they appear on common indicators, so in some cases, some assumptions are made based on historic values.
This means that in some cases, the indicator can “jump” into the conclusion too quickly. Although we try to eliminate this by using stationary filters, correlation checks, and Z-score momentum detection, there is still a chance some signals that are generated can be too early, in the stock market, that's the same as being incorrect. So make sure to use this with other indicators to confirm the movement.
How To Use The Indicator:
You can use the indicator as a standalone reversal system, as a filter for overbought and oversold setups, in combination with other trend indicators and as a part of a signal stack with other common indicators for divergence spotting and fade trades.
The indicator produces simple buy and sell signals when all criteria is met. Based on our own testing, we recommend treating these signals as standalone and independent from each other . Meaning that if you take position after a buy signal, don’t wait for a sell signal to appear to exit the trade and vice versa.
This is why we recommend using this indicator with other advanced or even simple indicators as an early confirmation tool.
The Display Table:
The floating diagnostic table in the top-right corner of the chart is a key part of this indicator. It's a live statistical dashboard that helps you understand why a signal is (or isn’t) being triggered, and whether the market conditions are lining up for a potential reversal.
1. Z-Score
What it shows: The current Z-score value of the volatility-normalized spread between the short EMA and the regression line of the long EMA.
Why it matters: Z-score tells you how statistically extreme the current relationship is. A Z-score of:
0 = perfectly average
> +2 = very overbought
< -2 = very oversold
How to use it: Look for Z-score reaching extreme highs or lows (beyond dynamic thresholds). Watch for it to start reversing direction, especially when paired with green table rows (see below)
2. Z-Score Momentum
What it shows: The rate of change (ROC) of the Z-score:
Zmomentum=Zt − Zt − 1
Why it matters: This tells you if the Z-score is still stretching out (e.g., getting more overbought/oversold), or reverting back toward the mean.
How to use it: A positive Z-momentum after a very low Z-score = potential bullish reversal A negative Z-momentum after a very high Z-score = potential bearish reversal. Avoid signals when momentum is still pushing deeper into extremes
3. Correlation
What it shows: The rolling Pearson correlation coefficient between the short EMA and long EMA.
Why it matters: High correlation (closer to +1) means the EMAs are still statistically connected — a key requirement for cointegration or mean reversion to be valid.
How to use it: Look for correlation > 0.7 for reliable signals. If correlation drops below 0.5, ignore the Z-score — the EMAs aren’t moving together anymore
4. Stationary
What it shows: A simplified "Yes" or "No" answer to the question:
“Is the spread statistically stable (stationary) and mean-reverting right now?”
Why it matters: Mean reversion strategies only work when the spread is stationary — that is, when the distance between EMAs behaves like a rubber band, not a drifting cloud.
How to use it: A "Yes" means the indicator sees a consistent, stable spread — good for trading. "No" means the market is too volatile, disjointed, or chaotic for reliable mean reversion. Wait for this to flip to "Yes" before trusting signals
5. Last Signal
What it shows: The last signal issued by the system — either "Buy", "Sell", or "None"
Why it matters: Helps avoid confusion and repeated entries. Signals only alternate — you won’t get another Buy until a Sell happens, and vice versa.
How to use it: If the last signal was a "Buy", and you’re watching for a Sell, don’t act on more bullish signals. Great for systems where you only want one position open at a time
6. Bars Since Signal
What it shows: How many bars (candles) have passed since the last Buy or Sell signal.
Why it matters: Gives you context for how long the current condition has persisted
How to use it: If it says 1 or 2, a signal just happened — avoid jumping in late. If it’s been 10+ bars, a new opportunity might be brewing soon. You can use this to time exits if you want to fade a recent signal manually
Indicator Settings:
Short EMA: Sets the short-term EMA period. The smaller the number, the more reactive and more signals you get.
Long EMA: Sets the slow EMA period. The larger this number is, the smoother baseline, and more reliable trend bases are generated.
Z-Score Lookback: The period or bars used for mean & std deviation of spread between short and long EMAs. Larger values result in smoother signals with fewer false positives.
Volatility Window: This value normalizes the spread by historical volatility. This allows you to prevent scale distortion, showing you a cleaner and better chart.
Correlation Lookback: How many periods or how far back to test correlation between slow and long EMAs. This filters out false positives when EMAs lose alignment.
Hurst Lookback: The multiplier to approximate stationarity. Lower leads to more sensitivity to regime change, higher produces a more stricter filtering.
Z Threshold Percentile: This value sets how extreme Z-score must be to trigger a signal. For example, 90 equals only top/bottom 10% of extremes, 80 = more frequent.
Min Bars Between Signals: This hard stop prevents back-to-back signals. The idea is to avoid over-trading or whipsaws in volatile markets even when Hurst lookback and volatility window values are not enough to filter signals.
Some More Recommendations:
We recommend trying different EMA pairs (10/50, 21/100, 5/20) for different asset behaviors. You can set percentile to 85 or 80 if you want more frequent but looser signals. You can also use the Z-score reversion monitor for powerful confirmation.
Multi-Timeframe Anchored VWAP Valuation# Multi-Timeframe Anchored VWAP Valuation
## Overview
This indicator provides a unique perspective on potential price valuation by comparing the current price to the Volume Weighted Average Price (VWAP) anchored to the start of multiple timeframes: Weekly, Monthly, Quarterly, and Yearly. It synthesizes these comparisons into a single oscillator value, helping traders gauge if the current price is potentially extended relative to significant volume-weighted levels.
## Core Concept & Calculation
1. **Anchored VWAP:** The script calculates the VWAP separately for the current Week, Month, Quarter (3 Months), and Year (12 Months), starting the calculation from the first bar of each period.
2. **Price Deviation:** It measures how far the current `close` price is from each of these anchored VWAPs. This distance is measured in terms of standard deviations calculated *within* that specific anchor period (e.g., how many weekly standard deviations the price is away from the weekly VWAP).
3. **Deviation Score (Multiplier):** Based on this standard deviation distance, a score is assigned. The further the price is from the VWAP (in terms of standard deviations), the higher the absolute score. The indicator uses linear interpolation to determine scores between the standard deviation levels (defaulted at 1, 2, and 3 standard deviations corresponding to scores of +/-2, +/-3, +/-4, with a score of 1 at the VWAP).
4. **Timeframe Weighting:** Longer timeframes are considered more significant. The deviation scores are multiplied by fixed scalars: Weekly (x1), Monthly (x2), Quarterly (x3), Yearly (x4).
5. **Final Valuation Metric:** The weighted scores from all four timeframes are summed up to produce the final oscillator value plotted in the indicator pane.
## How to Interpret and Use
* **Histogram (Indicator Pane):**
* The main output is the histogram representing the `Final Valuation Metric`.
* **Positive Values:** Suggest the price is generally trading above its volume-weighted averages across the timeframes, potentially indicating strength or relative "overvaluation."
* **Negative Values:** Suggest the price is generally trading below its volume-weighted averages, potentially indicating weakness or relative "undervaluation."
* **Values Near Zero:** Indicate the price is relatively close to its volume-weighted averages.
* **Histogram Color:**
* The color of the histogram bars provides context based on the metric's *own recent history*.
* **Green (Positive Color):** The metric is currently *above* its recent average plus a standard deviation band (dynamic upper threshold). This highlights potentially significant "overvalued" readings relative to its normal range.
* **Red (Negative Color):** The metric is currently *below* its recent average minus a standard deviation band (dynamic lower threshold). This highlights potentially significant "undervalued" readings relative to its normal range.
* **Gray (Neutral Color):** The metric is within its typical recent range (between the dynamic upper and lower thresholds).
* **Orange Line:** Plots the moving average of the `Final Valuation Metric` itself (based on the "Threshold Lookback Period"), serving as the centerline for the dynamic thresholds.
* **On-Chart Table:**
* Provides a detailed breakdown for transparency.
* Shows the calculated VWAP, the raw deviation multiplier score, and the final weighted (adjusted) metric for each individual timeframe (W, M, Q, Y).
* Displays the current price, the final combined metric value, and a textual interpretation ("Overvalued", "Undervalued", "Neutral") based on the dynamic thresholds.
## Potential Use Cases
* Identifying potential exhaustion points when the indicator reaches statistically high (green) or low (red) levels relative to its recent history.
* Assessing whether price trends are supported by underlying volume-weighted average prices across multiple timeframes.
* Can be used alongside other technical analysis tools for confirmation.
## Settings
* **Calculation Settings:**
* `STDEV Level 1`: Adjusts the 1st standard deviation level (default 1.0).
* `STDEV Level 2`: Adjusts the 2nd standard deviation level (default 2.0).
* `STDEV Level 3`: Adjusts the 3rd standard deviation level (default 3.0).
* **Interpretation Settings:**
* `Threshold Lookback Period`: Defines the number of bars used to calculate the average and standard deviation of the final metric for dynamic thresholds (default 200).
* `Threshold StDev Multiplier`: Controls how many standard deviations above/below the metric's average are used to set the "Overvalued"/"Undervalued" thresholds (default 1.0).
* **Table Settings:** Customize the position and colors of the data table displayed on the chart.
## Important Considerations
* This indicator measures price deviation relative to *anchored* VWAPs and its *own historical range*. It is not a standalone trading system.
* The interpretation of "Overvalued" and "Undervalued" is relative to the indicator's logic and calculations; it does not guarantee future price movement.
* Like all indicators, past performance is not indicative of future results. Use this tool as part of a comprehensive analysis and risk management strategy.
* The anchored VWAP and Standard Deviation values reset at the beginning of each respective period (Week, Month, Quarter, Year).
MÈGAS ALGO : ZIG-ZAG CYCLE INSIGTH [INDICATOR]Overview
The Zig-Zag Cycle Insigth is a revisited version of the classic Zig Zag indicator, designed to provide traders with a more comprehensive and actionable view of price movements.
This advanced tool not only highlights significant price swings but also incorporates additional features such as cycle analysis, real-time data tracking, and Fibonacci retracement levels. These enhancements make it an invaluable resource for identifying trends, potential reversal points, and market structure.
This indicator adheres to TradingView's guidelines and is optimized for both technical analysts and active traders who seek deeper insights into market dynamics.
Key Features:
1. Customizable Thresholds for Price Movements:
- Users can set personalized thresholds for price movement percentages and time periods.
This ensures that only significant price swings are plotted, reducing noise and increasing
clarity.
- Straight lines connect swing highs and lows, providing a cleaner visual representation of
the trend.
2. Cycle Analysis Table:
- A dynamic table is included to analyze price cycles based on three key factors:
- Price Change: Measures the magnitude of each swing (high-to-low or low-to-high).
- Time Duration (Bar Count): Tracks the number of bars elapsed between consecutive swings,
offering precise timing insights.
- Volume: Analyzes trading volume during each segment of the cycle.
- The indicator calculates the **maximum**, **minimum**, and **mean** values for each
parameter across all completed cycles, providing deeper statistical insights into market
behavior.
- This table updates in real-time, offering traders a quantitative understanding of how price
behaves over different cycles.
3. Real-Time Data Integration:
- The indicator displays live updates of current price action relative to the last identified
swing high/low. This includes:
- Current distance from the last pivot point.
- Percentage change since the last pivot.
- Volume traded since the last pivot.
4. Fibonacci Retracement Levels:
- Integrated Fibonacci retracement levels are dynamically calculated based on the most
recent significant swing high and low.
- Key retracement levels (23.6%, 38.2%, 50%, 61.8%, and 78.6%) are plotted alongside the Zig
Zag lines, helping traders identify potential support/resistance zones.
- Extension levels (100%, 161.8%, etc.) are also included to anticipate possible breakout
targets.
5. Customizable Alerts:
- Users can configure alerts for specific real-time conditions, such as:
- Price Change
- Duration
- Volume
- Fibonacci Retracement Levels
How It Works:
1. Zig Zag Identification:
- The indicator scans historical price data to identify significant turning points where the
price moves by at least the user-defined percentage threshold.
- These turning points are connected by straight lines to form the Zig Zag pattern.
2. Cycle Analysis:
For each completed cycle (from one swing high/low to the next), the indicator calculates:
- Price Change: Difference between the start and end prices of the cycle.
- Maximum Price Change: The largest price difference observed across all cycles.
- Minimum Price Change: The smallest price difference observed across all cycles.
- Mean Price Change: The average price difference across all cycles.
- Time Duration (Bar Count): Number of bars elapsed between consecutive swings.
- Maximum Duration: The longest cycle in terms of bar count.
- Minimum Duration: The shortest cycle in terms of bar count.
- Mean Duration: The average cycle length in terms of bar count.
- Volume: Total volume traded during the cycle.
- Maximum Volume: The highest volume traded during any single cycle.
- Minimum Volume: The lowest volume traded during any single cycle.
- Mean Volume: The average volume traded across all cycles.
- These calculations provide traders with a statistical overview of market behavior, enabling
them to identify patterns and anomalies in price, time, and volume.
3. Fibonacci Integration:
- Once a new swing high or low is identified, the indicator automatically calculates Fibonacci
retracement and extension levels.
- These levels serve as reference points for potential entry/exit opportunities.
4. Real-Time Updates:
- As the market evolves, the indicator continuously monitors the relationship between the
current price and the last identified swing point.
- Real-time metrics, such as percentage change and volume, are updated dynamically.
5. Alerts Based on Real-Time Parameters:
- The indicator allows users to set customizable alerts based on real-time conditions:
- Price Change Alert: Triggered when the real-time price change is less or greater than a
predefined percentage threshold (e.g., > or < fixed value).
- Duration Alert: Triggered when the cycle duration (in bars) is less or greater than a
predefined
bar count threshold (e.g., > or < fixed value).
- Volume Alert: Triggered when the trading volume during the current cycle is less or greater
than a predefined volume threshold (e.g., > or < fixed value).
Advantages of Zig-Zag Cycle Insigth
- Comprehensive Insights: Combining cycle analysis, Fibonacci retracements, and real-time data
provides a holistic view of market conditions.
- Statistical Analysis: The inclusion of maximum, minimum, and mean values for price change,
duration, and volume offers deeper insights into market behavior.
- Actionable Signals: Customizable alerts ensure traders never miss critical market events based
on real-time price, duration, and volume parameters.
- User-Friendly Design: Clear visuals and intuitive controls make it accessible for traders of all
skill levels.
Reference:
TradingView/ZigZag
TradingView/AutofibRetracement
Please Note:
This indicator is provided for informational and educational purposes only. It is not financial advice, and it should not be considered a recommendation to buy, sell, or trade any financial instrument. Trading involves significant risks, including the potential loss of your entire investment. Always conduct your own research and consult with a licensed financial advisor before making any trading decisions.
The results and images provided are based on algorithms and historical/paid real-time market data but do not guarantee future results or accuracy. Use this tool at your own risk, and understand that past performance is not indicative of future outcomes.
MonthlyReturnTableLibrary "MonthlyReturnTable"
TODO: The table displays monthly returns, profits, MDD, and number of trades.
get_table(mode, tablePosition, precision, textSize, marginTop, marginBottom, marginLeft, marginRight, colorHead, colorBull, colorBear, colorZero)
: get_table
Parameters:
mode (string)
tablePosition (string)
precision (int)
textSize (int)
marginTop (int)
marginBottom (int)
marginLeft (int)
marginRight (int)
colorHead (color)
colorBull (color)
colorBear (color)
colorZero (color)
Returns: : null, plot perfTable
Risk MeterRisk Meter Indicator for TradingView
The Risk Meter is a powerful market risk assessment tool designed to help traders evaluate the current risk environment using a simple, data-driven score. By analyzing four critical market factors—VIX (volatility index), market breadth, trailing volatility, and credit spreads—the indicator generates a risk score between 0 and 4. This score empowers traders to make informed decisions about hedging, exiting positions, or re-entering the market, with clear visual cues and alerts for intraday monitoring.
What It Does
Calculates a Risk Score: Assigns a score from 0 to 4, where each point reflects an active risk condition based on four market indicators.
Identifies Risk Levels:
A score of 3 or higher indicates a high-risk environment, suggesting traders consider hedging or reducing exposure.
A score of 2 or lower for at least two consecutive days signals a potential opportunity to re-enter the market.
Provides Visual Feedback: Uses color-coded Columns, threshold markers, and a component table for quick interpretation.
Supports Decision-Making: Offers a structured approach to managing risk and timing trades.
How It Works
The Risk Meter aggregates four key risk conditions, each contributing 1 point to the total score when triggered:
Elevated and Rising VIX (Risk 1)
Condition: The VIX is above 18 and higher than it was 20 days ago.
Purpose: Detects increasing market fear or uncertainty.
Market Breadth Dropping (Risk 2)
Condition: Either:
Fewer than 50% of S&P 500 stocks are above their 200-day moving average and fewer than 70% are above their 50-day moving average, or
The 3-day EMA of the 200-day breadth falls below 80% of its 20-day SMA.
Purpose: Identifies weakening participation across the market.
Trailing Volatility (Risk 3)
Condition: The 30-day annualized volatility of the equal-weight S&P 500 (RSP) exceeds 35%.
Purpose: Highlights periods of heightened price instability.
Credit Spreads (Risk 4)
Condition: The price ratio of high-yield bonds (HYG) to Treasuries (TLT or IEF) is lower than it was 20 days ago, indicating widening credit spreads.
Purpose: Signals potential stress in credit markets.
The total risk score is the sum of these conditions (0 to 4). Additionally, the indicator tracks consecutive days with a score of 2 or lower to generate re-entry signals.
How to Read It Intraday
The Risk Meter is built on daily data but can be monitored intraday for real-time insights. Here’s how traders can interpret it:
Risk Score Plot:
Displayed as a step line ranging from 0 to 4.
Colors:
Red: High risk (score ≥ 3) – caution advised.
Green: Re-entry signal – score ≤ 2 for at least two consecutive days (triggered when the count increments from 1 to 2).
Blue: Neutral or low risk (score < 3 without a re-entry signal).
Threshold Lines:
Dashed Gray Line at 3: Marks the high-risk threshold.
Dotted Gray Line at 2: Indicates the low-risk threshold for re-entry signals.
Risk Component Table:
Located in the top-right corner, it lists:
VIX, Breadth, Volatility, and Credit Spreads.
Status: Shows "" (warning, red) if the risk condition is met, or "✓" (safe, blue) if not.
Helps traders pinpoint which factors are driving the score.
Alerts:
High Risk Alert: Triggers when the score moves from < 3 to ≥ 3.
Re-entry Signal Alert: Triggers when the score ≤ 2 for two consecutive days.
Intraday Usage Tips
Check the indicator throughout the day for early signs of risk shifts, especially if the score is near a threshold (e.g., 2 or 3).
Combine with other intraday tools (e.g., price action, volume) since the Risk Meter updates daily but reflects broader market conditions.
How Traders Can Use It
High-Risk Signal (Score ≥ 3):
Consider hedging positions (e.g., with options) or reducing equity exposure to protect against potential downturns.
Re-entry Signal (Score ≤ 2 for 2+ Days):
Look to re-enter the market or increase exposure, as it suggests stabilizing conditions.
Daily Risk Management:
Use the score and table to assess overall market health and adjust strategies accordingly.
Alert-Driven Trading:
Set up alerts to stay notified of critical risk changes without constant monitoring.
Why Use the Risk Meter?
This indicator offers a systematic, multi-factor approach to risk assessment, blending volatility, breadth, and credit market data into an easy-to-read score. Whether you’re an intraday trader or a longer-term investor, the Risk Meter helps you stay proactive, avoid surprises, and time your trades with greater confidence.
Financial Risk Disclaimer for the Risk Meter Tool
Important Notice: The Risk Meter is a market risk assessment tool designed to provide insights into current market conditions based on historical data and predefined indicators. It is intended for informational and educational purposes only and should not be considered financial advice, a recommendation to buy or sell any securities, or a guarantee of future market performance.
Key Considerations
No Guarantee of Accuracy: While the Risk Meter utilizes reliable data sources and established financial metrics, the creators do not guarantee the accuracy, completeness, or timeliness of the information provided. Financial markets are complex and subject to rapid, unpredictable changes, and the tool’s output may not fully reflect all market dynamics.
Market Risks: Trading and investing in financial markets carry significant risks, including the potential loss of principal. Market volatility, economic shifts, and other factors can lead to unexpected outcomes. Past performance is not a reliable indicator of future results, and the Risk Meter’s assessments are based on historical data, not future predictions.
Not a Substitute for Professional Advice: The Risk Meter is not intended to replace personalized financial guidance. Users are strongly encouraged to consult a qualified financial advisor, perform their own research, and evaluate their personal financial situation, risk tolerance, and investment objectives before making any trading or investment decisions.
Limitation of Liability: The creators of the Risk Meter, including any affiliates, developers, or contributors, are not liable for any direct, indirect, incidental, or consequential losses or damages arising from the use of this tool. This includes, but is not limited to, financial losses, missed opportunities, or decisions based on the tool’s output.
User Responsibility: By using the Risk Meter, you accept full responsibility for your trading and investment decisions. You acknowledge that you use the tool at your own risk and that the creators bear no responsibility for any outcomes resulting from its use.
Final Note
The Risk Meter is a supplementary tool designed to enhance your understanding of market risk. It is not a comprehensive solution for investment management. Approach trading and investing with caution, ensuring your decisions align with your personal financial strategy.
BRT CHARTS MTFDescription of the Indicator
This indicator is designed to visualize and analyze price movements across multiple timeframes simultaneously. It displays candles from selected time intervals directly on the current chart, allowing traders to quickly assess market conditions without switching between different timeframes. This is particularly useful for traders who use multi-timeframe analysis to make trading decisions.
Key Features of the Indicator:
1. Displaying Candles from Multiple Timeframes:
- The indicator allows you to select three timeframes (e.g., 1 hour, 4 hours, and 1 day) and displays their candles on the current chart. This helps to see the overall market picture without switching between charts.
- Candles are displayed as vertical columns, each containing the body and wicks (shadows) of the candle. The colors of the candles (green for bullish and red for bearish) are customizable.
2. Dynamic Updates:
- The indicator automatically updates the candles as new data arrives, allowing you to track market changes in real time.
3. Customizable Number of Candles:
- The user can choose how many candles to display for each timeframe (default is 4 candles). This allows the indicator to be adapted to individual needs.
4. Range Display (High/Low):
- The indicator can show High and Low levels for each timeframe, helping to identify key support and resistance levels.
- It is also possible to display the Mid level (average between High and Low), which can be useful for identifying consolidation zones.
5. Data Table:
- The indicator supports displaying a table with key levels (High, Low, Mid) for each timeframe. The table can be placed in any corner of the chart, and its size and text/background colors are customizable.
6. Flexible Appearance Settings:
- The user can customize the colors of the candles, their wicks, High/Low/Mid levels, as well as the placement of the columns on the chart.
How the Indicator Helps in Trading:
- Multi-Timeframe Analysis: The indicator allows you to analyze multiple timeframes simultaneously, helping to better understand the overall trend and find entry points. For example, if the trend is bullish on the daily timeframe and there is a correction on the hourly timeframe, this could be a good opportunity to buy.
- Identifying Key Levels: Displaying High, Low, and Mid levels helps quickly identify support and resistance zones, which is useful for setting stop-loss and take-profit levels.
- Time-Saving: The indicator eliminates the need to switch between timeframes, speeding up the analysis and decision-making process.
- Visual Clarity: Visualizing candles from different timeframes on a single chart makes analysis more convenient and intuitive.
Example Use Cases:
1. Trend Trading: If a clear uptrend is visible on the daily timeframe and a correction is occurring on the hourly timeframe, you can look for buy opportunities near support levels.
2. Range Trading: If the price is moving sideways across all timeframes, you can use High and Low levels to trade from the boundaries of the range.
3. Identifying Reversal Points: If the price approaches a key resistance level on the higher timeframe and a bearish candle forms on the lower timeframe, this could be a signal to sell.
Conclusion:
This indicator is a powerful tool for traders who use multi-timeframe analysis. It helps quickly assess market conditions, identify key levels, and make informed trading decisions. Thanks to its flexible settings, the indicator can be adapted to any trading style and visualization preferences.
Divergence IQ [TradingIQ]Hello Traders!
Introducing "Divergence IQ"
Divergence IQ lets traders identify divergences between price action and almost ANY TradingView technical indicator. This tool is designed to help you spot potential trend reversals and continuation patterns with a range of configurable features.
Features
Divergence Detection
Detects both regular and hidden divergences for bullish and bearish setups by comparing price movements with changes in the indicator.
Offers two detection methods: one based on classic pivot point analysis and another that provides immediate divergence signals.
Option to use closing prices for divergence detection, allowing you to choose the data that best fits your strategy.
Normalization Options:
Includes multiple normalization techniques such as robust scaling, rolling Z-score, rolling min-max, or no normalization at all.
Adjustable normalization window lets you customize the indicator to suit various market conditions.
Option to display the normalized indicator on the chart for clearer visual comparison.
Allows traders to take indicators that aren't oscillators, and convert them into an oscillator - allowing for better divergence detection.
Simulated Trade Management:
Integrates simulated trade entries and exits based on divergence signals to demonstrate potential trading outcomes.
Customizable exit strategies with options for ATR-based or percentage-based stop loss and profit target settings.
Automatically calculates key trade metrics such as profit percentage, win rate, profit factor, and total trade count.
Visual Enhancements and On-Chart Displays:
Color-coded signals differentiate between bullish, bearish, hidden bullish, and hidden bearish divergence setups.
On-chart labels, lines, and gradient flow visualizations clearly mark divergence signals, entry points, and exit levels.
Configurable settings let you choose whether to display divergence signals on the price chart or in a separate pane.
Performance Metrics Table:
A performance table dynamically displays important statistics like profit, win rate, profit factor, and number of trades.
This feature offers an at-a-glance assessment of how the divergence-based strategy is performing.
The image above shows Divergence IQ successfully identifying and trading a bullish divergence between an indicator and price action!
The image above shows Divergence IQ successfully identifying and trading a bearish divergence between an indicator and price action!
The image above shows Divergence IQ successfully identifying and trading a hidden bullish divergence between an indicator and price action!
The image above shows Divergence IQ successfully identifying and trading a hidden bearish divergence between an indicator and price action!
The performance table is designed to provide a clear summary of simulated trade results based on divergence setups. You can easily review key metrics to assess the strategy’s effectiveness over different time periods.
Customization and Adaptability
Divergence IQ offers a wide range of configurable settings to tailor the indicator to your personal trading approach. You can adjust the lookback and lookahead periods for pivot detection, select your preferred method for normalization, and modify trade exit parameters to manage risk according to your strategy. The tool’s clear visual elements and comprehensive performance metrics make it a useful addition to your technical analysis toolbox.
The image above shows Divergence IQ identifying divergences between price action and OBV with no normalization technique applied.
While traders can look for divergences between OBV and price, OBV doesn't naturally behave like an oscillator, with no definable upper and lower threshold, OBV can infinitely increase or decrease.
With Divergence IQ's ability to normalize any indicator, traders can normalize non-oscillator technical indicators such as OBV, CVD, MACD, or even a moving average.
In the image above, the "Robust Scaling" normalization technique is selected. Consequently, the output of OBV has changed and is now behaving similar to an oscillator-like technical indicator. This makes spotting divergences between the indicator and price easier and more appropriate.
The three normalization techniques included will change the indicator's final output to be more compatible with divergence detection.
This feature can be used with almost any technical indicator.
Stop Type
Traders can select between ATR based profit targets and stop losses, or percentage based profit targets and stop losses.
The image above shows options for the feature.
Divergence Detection Method
A natural pitfall of divergence trading is that it generally takes several bars to "confirm" a divergence. This makes trading the divergence complicated, because the entry at time of the divergence might look great; however, the divergence wasn't actually signaled until several bars later.
To circumvent this issue, Divergence IQ offers two divergence detection mechanisms.
Pivot Detection
Pivot detection mode is the same as almost every divergence indicator on TradingView. The Pivots High Low indicator is used to detect market/indicator highs and lows and, consequently, divergences.
This method generally finds the "best looking" divergences, but will always take additional time to confirm the divergence.
Immediate Detection
Immediate detection mode attempts to reduce lag between the divergence and its confirmation to as little as possible while avoiding repainting.
Immediate detection mode still uses the Pivots Detection model to find the first high/low of a divergence. However, the most recent high/low does not utilize the Pivot Detection model, and instead immediately looks for a divergence between price and an indicator.
Immediate Detection Mode will always signal a divergence one bar after it's occurred, and traders can set alerts in this mode to be alerted as soon as the divergence occurs.
TradingView Backtester Integration
Divergence IQ is fully compatible with the TradingView backtester!
Divergence IQ isn’t designed to be a “profitable strategy” for users to trade. Instead, the intention of including the backtester is to let users backtest divergence-based trading strategies between the asset on their chart and almost any technical indicator, and to see if divergences have any predictive utility in that market.
So while the backtester is available in Divergence IQ, it’s for users to personally figure out if they should consider a divergence an actionable insight, and not a solicitation that Divergence IQ is a profitable trading strategy. Divergence IQ should be thought of as a Divergence backtesting toolkit, not a full-feature trading strategy.
Strategy Properties Used For Backtest
Initial Capital: $1000 - a realistic amount of starting capital that will resonate with many traders
Amount Per Trade: 5% of equity - a realistic amount of capital to invest relative to portfolio size
Commission: 0.02% - a conservative amount of commission to pay for trade that is standard in crypto trading, and very high for other markets.
Slippage: 1 tick - appropriate for liquid markets, but must be increased in markets with low activity.
Once more, the backtester is meant for traders to personally figure out if divergences are actionable trading signals on the market they wish to trade with the indicator they wish to use.
And that's all!
If you have any cool features you think can benefit Divergence IQ - please feel free to share them!
Thank you so much TradingView community!
Historical Monthly Returns TrackerThe Historical Monthly Returns Tracker is a powerful Pine Script v5 indicator designed to provide a detailed performance analysis of an asset’s monthly returns over time. It calculates and displays the percentage change for each month, aggregated into a structured table. The indicator helps traders and investors identify seasonal trends, recurring patterns, and historical profitability for a selected asset.
Key Features
✅ Historical Performance Analysis – Tracks monthly percentage changes for any asset.
✅ Customizable Start Year – Users can define the beginning year for data analysis.
✅ Comprehensive Data Table – Displays a structured table with yearly returns per month.
✅ Aggregated Statistics – Shows average return, total sum, number of positive months, and win rate (WR) for each month.
✅ Clear Color Coding – Highlights positive returns in green, negative in red, and neutral in gray.
✅ Works on Daily & Monthly Timeframes – Ensures accurate calculations based on higher timeframes.
How It Works
Data Collection:
The script fetches monthly closing prices.
It calculates month-over-month percentage change.
The values are stored in a matrix for further processing.
Table Generation:
Displays a structured table where each row represents a year, and each column represents a month (Jan–Dec).
Monthly returns are color-coded for easy interpretation.
Aggregated Statistics:
AVG: The average return per month across all available years.
SUM: The total cumulative return for each month.
+ive: The number of times a month had positive performance vs. total occurrences.
WR (Win Rate): The percentage of times a month had a positive return.
Use Cases
📈 Seasonality Analysis: Identify which months historically perform better or worse.
📊 Risk Management: Plan trading strategies based on historical trends.
🔍 Backtesting Aid: Support algorithmic and discretionary traders with real data insights.
🔄 Asset Comparison: Compare different stocks, forex pairs, or cryptocurrencies for their seasonal behavior.
How to Use
Apply the Indicator to a chart in TradingView.
Ensure your timeframe is Daily or Monthly (lower timeframes are not supported).
The table will automatically populate based on available historical data.
Analyze the patterns, trends, and win rates to optimize trading decisions.
Limitations
⚠️ Requires a sufficient amount of historical data to provide accurate analysis.
⚠️ Works best on high-liquidity assets (stocks, indices, forex, crypto).
⚠️ Not a predictive tool but rather a historical performance tracker.
Final Thoughts
The Historical Monthly Returns Tracker is an excellent tool for traders seeking to leverage seasonal trends in their strategies. Whether you're a stock, forex, or crypto trader, this indicator provides clear, data-driven insights to help refine entry and exit points based on historical patterns.
🚀 Use this tool to make smarter, more informed trading decisions!
Oracle Fear and GreedCustom Fear and Greed Oscillator with Movement Table
This indicator provides a unique perspective on market sentiment by calculating a custom fear/greed oscillator based on Heikin-Ashi candles. The oscillator is centered at 50, with values above 50 suggesting bullish sentiment ("greed") and below 50 indicating bearish sentiment ("fear"). The calculation incorporates candle body size, range, and a custom "candle strength" measure, providing an innovative approach to understanding market behavior.
Key Features:
Heikin-Ashi Based Oscillator:
Utilizes Heikin-Ashi candles to compute a custom oscillator. The value is centered at 50, with deviations indicating the prevailing market sentiment.
Dynamic Gradient Coloring:
The oscillator line is dynamically colored with a smooth gradient—from blue (representing fear) at lower values to pink (representing greed) at higher values—making it visually intuitive.
Horizontal Levels:
Two additional horizontal lines are drawn at 40.62 ("Bottom") and 60.74 ("Top"), which may serve as potential oversold and overbought boundaries respectively.
Fast Movement Metrics:
Every 5 bars, the indicator calculates the percentage change in the Heikin-Ashi close. This fast movement analysis distinguishes rapid downward moves (fast fear) from rapid upward moves (fast greed), helping to capture sudden market shifts.
Information Table:
A table in the top-right corner displays the most recent fast movement values for both fear and greed, offering quick insights into short-term market dynamics.
Usage Tips:
Adjust the smoothing period to match your preferred trading timeframe.
Use the oscillator alongside other analysis tools for more robust trading decisions.
Ideal for those looking to experiment with new approaches to sentiment analysis and momentum detection.
Disclaimer:
This indicator is intended for educational and experimental purposes. It should not be used as the sole basis for any trading decisions. Always combine with comprehensive market analysis and risk management strategies.
You can add this description when publishing your indicator on TradingView to help other users understand its features and intended use.
Multi-Asset & TF RSI
Multi-Asset & TF RSI
This indicator allows you to compare the Relative Strength Index (RSI) values of two different assets across multiple timeframes in a single pane. It’s ideal for traders who wish to monitor momentum across different markets or instruments simultaneously.
Key Features:
Primary Asset RSI:
The indicator automatically calculates the RSI for the chart’s asset. You can adjust the timeframe for this asset using a dropdown that offers standard TradingView timeframes, a "Chart" option (which syncs with your current chart timeframe), or a "Custom" option where you can enter any timeframe.
Optional Second Asset RSI:
Enable the “Display Second Asset” option to compare another asset’s RSI. Simply select the symbol (default is “DXY”) and choose its timeframe from an identical dropdown. When enabled, the second asset’s RSI is computed and plotted for easy comparison.
RSI Settings:
Customize the RSI length and choose the data source (e.g., close price) to suit your trading strategy.
Visual Aids:
Overbought (70) and oversold (30) levels are clearly marked, along with a midline at 50. These visual cues help you quickly assess market conditions.
Asset Information Table:
A dynamic table at the top of the pane displays the symbols being analysed – the chart’s asset as the “1st” asset and, if enabled, the second asset as the “2nd.”
How to Use:
Apply the Indicator:
Add the indicator to your chart. By default, it will calculate the RSI for the chart’s current asset using your chart’s timeframe.
Adjust Primary Asset Settings:
Use the “Main Asset Timeframe” dropdown to choose the timeframe for the RSI calculation on the chart asset. Select “Chart” to automatically match your current chart’s timeframe or choose a preset/custom timeframe.
Enable and Configure the Second Asset:
Toggle the “Display Second Asset” option to enable the second asset’s RSI. Select the asset symbol and its desired timeframe using the provided dropdown. The RSI for the second asset will be plotted if enabled.
Monitor the RSI Values:
Observe the plotted RSI lines along with the overbought/oversold levels. Use the table at the top-centre of the pane to verify which asset symbols are being displayed.
This versatile tool is designed to support multi-asset analysis and can be a valuable addition to your technical analysis toolkit. Enjoy enhanced RSI comparison across markets and timeframes!
Happy Trading!
ValueAtTime█ OVERVIEW
This library is a Pine Script® programming tool for accessing historical values in a time series using UNIX timestamps . Its data structure and functions index values by time, allowing scripts to retrieve past values based on absolute timestamps or relative time offsets instead of relying on bar index offsets.
█ CONCEPTS
UNIX timestamps
In Pine Script®, a UNIX timestamp is an integer representing the number of milliseconds elapsed since January 1, 1970, at 00:00:00 UTC (the UNIX Epoch ). The timestamp is a unique, absolute representation of a specific point in time. Unlike a calendar date and time, a UNIX timestamp's meaning does not change relative to any time zone .
This library's functions process series values and corresponding UNIX timestamps in pairs , offering a simplified way to identify values that occur at or near distinct points in time instead of on specific bars.
Storing and retrieving time-value pairs
This library's `Data` type defines the structure for collecting time and value information in pairs. Objects of the `Data` type contain the following two fields:
• `times` – An array of "int" UNIX timestamps for each recorded value.
• `values` – An array of "float" values for each saved timestamp.
Each index in both arrays refers to a specific time-value pair. For instance, the `times` and `values` elements at index 0 represent the first saved timestamp and corresponding value. The library functions that maintain `Data` objects queue up to one time-value pair per bar into the object's arrays, where the saved timestamp represents the bar's opening time .
Because the `times` array contains a distinct UNIX timestamp for each item in the `values` array, it serves as a custom mapping for retrieving saved values. All the library functions that return information from a `Data` object use this simple two-step process to identify a value based on time:
1. Perform a binary search on the `times` array to find the earliest saved timestamp closest to the specified time or offset and get the element's index.
2. Access the element from the `values` array at the retrieved index, returning the stored value corresponding to the found timestamp.
Value search methods
There are several techniques programmers can use to identify historical values from corresponding timestamps. This library's functions include three different search methods to locate and retrieve values based on absolute times or relative time offsets:
Timestamp search
Find the value with the earliest saved timestamp closest to a specified timestamp.
Millisecond offset search
Find the value with the earliest saved timestamp closest to a specified number of milliseconds behind the current bar's opening time. This search method provides a time-based alternative to retrieving historical values at specific bar offsets.
Period offset search
Locate the value with the earliest saved timestamp closest to a defined period offset behind the current bar's opening time. The function calculates the span of the offset based on a period string . The "string" must contain one of the following unit tokens:
• "D" for days
• "W" for weeks
• "M" for months
• "Y" for years
• "YTD" for year-to-date, meaning the time elapsed since the beginning of the bar's opening year in the exchange time zone.
The period string can include a multiplier prefix for all supported units except "YTD" (e.g., "2W" for two weeks).
Note that the precise span covered by the "M", "Y", and "YTD" units varies across time. The "1M" period can cover 28, 29, 30, or 31 days, depending on the bar's opening month and year in the exchange time zone. The "1Y" period covers 365 or 366 days, depending on leap years. The "YTD" period's span changes with each new bar, because it always measures the time from the start of the current bar's opening year.
█ CALCULATIONS AND USE
This library's functions offer a flexible, structured approach to retrieving historical values at or near specific timestamps, millisecond offsets, or period offsets for different analytical needs.
See below for explanations of the exported functions and how to use them.
Retrieving single values
The library includes three functions that retrieve a single stored value using timestamp, millisecond offset, or period offset search methods:
• `valueAtTime()` – Locates the saved value with the earliest timestamp closest to a specified timestamp.
• `valueAtTimeOffset()` – Finds the saved value with the earliest timestamp closest to the specified number of milliseconds behind the current bar's opening time.
• `valueAtPeriodOffset()` – Finds the saved value with the earliest timestamp closest to the period-based offset behind the current bar's opening time.
Each function has two overloads for advanced and simple use cases. The first overload searches for a value in a user-specified `Data` object created by the `collectData()` function (see below). It returns a tuple containing the found value and the corresponding timestamp.
The second overload maintains a `Data` object internally to store and retrieve values for a specified `source` series. This overload returns a tuple containing the historical `source` value, the corresponding timestamp, and the current bar's `source` value, making it helpful for comparing past and present values from requested contexts.
Retrieving multiple values
The library includes the following functions to retrieve values from multiple historical points in time, facilitating calculations and comparisons with values retrieved across several intervals:
• `getDataAtTimes()` – Locates a past `source` value for each item in a `timestamps` array. Each retrieved value's timestamp represents the earliest time closest to one of the specified timestamps.
• `getDataAtTimeOffsets()` – Finds a past `source` value for each item in a `timeOffsets` array. Each retrieved value's timestamp represents the earliest time closest to one of the specified millisecond offsets behind the current bar's opening time.
• `getDataAtPeriodOffsets()` – Finds a past value for each item in a `periods` array. Each retrieved value's timestamp represents the earliest time closest to one of the specified period offsets behind the current bar's opening time.
Each function returns a tuple with arrays containing the found `source` values and their corresponding timestamps. In addition, the tuple includes the current `source` value and the symbol's description, which also makes these functions helpful for multi-interval comparisons using data from requested contexts.
Processing period inputs
When writing scripts that retrieve historical values based on several user-specified period offsets, the most concise approach is to create a single text input that allows users to list each period, then process the "string" list into an array for use in the `getDataAtPeriodOffsets()` function.
This library includes a `getArrayFromString()` function to provide a simple way to process strings containing comma-separated lists of periods. The function splits the specified `str` by its commas and returns an array containing every non-empty item in the list with surrounding whitespaces removed. View the example code to see how we use this function to process the value of a text area input .
Calculating period offset times
Because the exact amount of time covered by a specified period offset can vary, it is often helpful to verify the resulting times when using the `valueAtPeriodOffset()` or `getDataAtPeriodOffsets()` functions to ensure the calculations work as intended for your use case.
The library's `periodToTimestamp()` function calculates an offset timestamp from a given period and reference time. With this function, programmers can verify the time offsets in a period-based data search and use the calculated offset times in additional operations.
For periods with "D" or "W" units, the function calculates the time offset based on the absolute number of milliseconds the period covers (e.g., `86400000` for "1D"). For periods with "M", "Y", or "YTD" units, the function calculates an offset time based on the reference time's calendar date in the exchange time zone.
Collecting data
All the `getDataAt*()` functions, and the second overloads of the `valueAt*()` functions, collect and maintain data internally, meaning scripts do not require a separate `Data` object when using them. However, the first overloads of the `valueAt*()` functions do not collect data, because they retrieve values from a user-specified `Data` object.
For cases where a script requires a separate `Data` object for use with these overloads or other custom routines, this library exports the `collectData()` function. This function queues each bar's `source` value and opening timestamp into a `Data` object and returns the object's ID.
This function is particularly useful when searching for values from a specific series more than once. For instance, instead of using multiple calls to the second overloads of `valueAt*()` functions with the same `source` argument, programmers can call `collectData()` to store each bar's `source` and opening timestamp, then use the returned `Data` object's ID in calls to the first `valueAt*()` overloads to reduce memory usage.
The `collectData()` function and all the functions that collect data internally include two optional parameters for limiting the saved time-value pairs to a sliding window: `timeOffsetLimit` and `timeframeLimit`. When either has a non-na argument, the function restricts the collected data to the maximum number of recent bars covered by the specified millisecond- and timeframe-based intervals.
NOTE : All calls to the functions that collect data for a `source` series can execute up to once per bar or realtime tick, because each stored value requires a unique corresponding timestamp. Therefore, scripts cannot call these functions iteratively within a loop . If a call to these functions executes more than once inside a loop's scope, it causes a runtime error.
█ EXAMPLE CODE
The example code at the end of the script demonstrates one possible use case for this library's functions. The code retrieves historical price data at user-specified period offsets, calculates price returns for each period from the retrieved data, and then populates a table with the results.
The example code's process is as follows:
1. Input a list of periods – The user specifies a comma-separated list of period strings in the script's "Period list" input (e.g., "1W, 1M, 3M, 1Y, YTD"). Each item in the input list represents a period offset from the latest bar's opening time.
2. Process the period list – The example calls `getArrayFromString()` on the first bar to split the input list by its commas and construct an array of period strings.
3. Request historical data – The code uses a call to `getDataAtPeriodOffsets()` as the `expression` argument in a request.security() call to retrieve the closing prices of "1D" bars for each period included in the processed `periods` array.
4. Display information in a table – On the latest bar, the code uses the retrieved data to calculate price returns over each specified period, then populates a two-row table with the results. The cells for each return percentage are color-coded based on the magnitude and direction of the price change. The cells also include tooltips showing the compared daily bar's opening date in the exchange time zone.
█ NOTES
• This library's architecture relies on a user-defined type (UDT) for its data storage format. UDTs are blueprints from which scripts create objects , i.e., composite structures with fields containing independent values or references of any supported type.
• The library functions search through a `Data` object's `times` array using the array.binary_search_leftmost() function, which is more efficient than looping through collected data to identify matching timestamps. Note that this built-in works only for arrays with elements sorted in ascending order .
• Each function that collects data from a `source` series updates the values and times stored in a local `Data` object's arrays. If a single call to these functions were to execute in a loop , it would store multiple values with an identical timestamp, which can cause erroneous search behavior. To prevent looped calls to these functions, the library uses the `checkCall()` helper function in their scopes. This function maintains a counter that increases by one each time it executes on a confirmed bar. If the count exceeds the total number of bars, indicating the call executes more than once in a loop, it raises a runtime error .
• Typically, when requesting higher-timeframe data with request.security() while using barmerge.lookahead_on as the `lookahead` argument, the `expression` argument should be offset with the history-referencing operator to prevent lookahead bias on historical bars. However, the call in this script's example code enables lookahead without offsetting the `expression` because the script displays results only on the last historical bar and all realtime bars, where there is no future data to leak into the past. This call ensures the displayed results use the latest data available from the context on realtime bars.
Look first. Then leap.
█ EXPORTED TYPES
Data
A structure for storing successive timestamps and corresponding values from a dataset.
Fields:
times (array) : An "int" array containing a UNIX timestamp for each value in the `values` array.
values (array) : A "float" array containing values corresponding to the timestamps in the `times` array.
█ EXPORTED FUNCTIONS
getArrayFromString(str)
Splits a "string" into an array of substrings using the comma (`,`) as the delimiter. The function trims surrounding whitespace characters from each substring, and it excludes empty substrings from the result.
Parameters:
str (series string) : The "string" to split into an array based on its commas.
Returns: (array) An array of trimmed substrings from the specified `str`.
periodToTimestamp(period, referenceTime)
Calculates a UNIX timestamp representing the point offset behind a reference time by the amount of time within the specified `period`.
Parameters:
period (series string) : The period string, which determines the time offset of the returned timestamp. The specified argument must contain a unit and an optional multiplier (e.g., "1Y", "3M", "2W", "YTD"). Supported units are:
- "Y" for years.
- "M" for months.
- "W" for weeks.
- "D" for days.
- "YTD" (Year-to-date) for the span from the start of the `referenceTime` value's year in the exchange time zone. An argument with this unit cannot contain a multiplier.
referenceTime (series int) : The millisecond UNIX timestamp from which to calculate the offset time.
Returns: (int) A millisecond UNIX timestamp representing the offset time point behind the `referenceTime`.
collectData(source, timeOffsetLimit, timeframeLimit)
Collects `source` and `time` data successively across bars. The function stores the information within a `Data` object for use in other exported functions/methods, such as `valueAtTimeOffset()` and `valueAtPeriodOffset()`. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
source (series float) : The source series to collect. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: (Data) A `Data` object containing collected `source` values and corresponding timestamps over the allowed time range.
method valueAtTime(data, timestamp)
(Overload 1 of 2) Retrieves value and time data from a `Data` object's fields at the index of the earliest timestamp closest to the specified `timestamp`. Callable as a method or a function.
Parameters:
data (series Data) : The `Data` object containing the collected time and value data.
timestamp (series int) : The millisecond UNIX timestamp to search. The function returns data for the earliest saved timestamp that is closest to the value.
Returns: ( ) A tuple containing the following data from the `Data` object:
- The stored value corresponding to the identified timestamp ("float").
- The earliest saved timestamp that is closest to the specified `timestamp` ("int").
valueAtTime(source, timestamp, timeOffsetLimit, timeframeLimit)
(Overload 2 of 2) Retrieves `source` and time information for the earliest bar whose opening timestamp is closest to the specified `timestamp`. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
source (series float) : The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timestamp (series int) : The millisecond UNIX timestamp to search. The function returns data for the earliest bar whose timestamp is closest to the value.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : (simple string) Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple containing the following data:
- The `source` value corresponding to the identified timestamp ("float").
- The earliest bar's timestamp that is closest to the specified `timestamp` ("int").
- The current bar's `source` value ("float").
method valueAtTimeOffset(data, timeOffset)
(Overload 1 of 2) Retrieves value and time data from a `Data` object's fields at the index of the earliest saved timestamp closest to `timeOffset` milliseconds behind the current bar's opening time. Callable as a method or a function.
Parameters:
data (series Data) : The `Data` object containing the collected time and value data.
timeOffset (series int) : The millisecond offset behind the bar's opening time. The function returns data for the earliest saved timestamp that is closest to the calculated offset time.
Returns: ( ) A tuple containing the following data from the `Data` object:
- The stored value corresponding to the identified timestamp ("float").
- The earliest saved timestamp that is closest to `timeOffset` milliseconds before the current bar's opening time ("int").
valueAtTimeOffset(source, timeOffset, timeOffsetLimit, timeframeLimit)
(Overload 2 of 2) Retrieves `source` and time information for the earliest bar whose opening timestamp is closest to `timeOffset` milliseconds behind the current bar's opening time. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
source (series float) : The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timeOffset (series int) : The millisecond offset behind the bar's opening time. The function returns data for the earliest bar's timestamp that is closest to the calculated offset time.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple containing the following data:
- The `source` value corresponding to the identified timestamp ("float").
- The earliest bar's timestamp that is closest to `timeOffset` milliseconds before the current bar's opening time ("int").
- The current bar's `source` value ("float").
method valueAtPeriodOffset(data, period)
(Overload 1 of 2) Retrieves value and time data from a `Data` object's fields at the index of the earliest timestamp closest to a calculated offset behind the current bar's opening time. The calculated offset represents the amount of time covered by the specified `period`. Callable as a method or a function.
Parameters:
data (series Data) : The `Data` object containing the collected time and value data.
period (series string) : The period string, which determines the calculated time offset. The specified argument must contain a unit and an optional multiplier (e.g., "1Y", "3M", "2W", "YTD"). Supported units are:
- "Y" for years.
- "M" for months.
- "W" for weeks.
- "D" for days.
- "YTD" (Year-to-date) for the span from the start of the current bar's year in the exchange time zone. An argument with this unit cannot contain a multiplier.
Returns: ( ) A tuple containing the following data from the `Data` object:
- The stored value corresponding to the identified timestamp ("float").
- The earliest saved timestamp that is closest to the calculated offset behind the bar's opening time ("int").
valueAtPeriodOffset(source, period, timeOffsetLimit, timeframeLimit)
(Overload 2 of 2) Retrieves `source` and time information for the earliest bar whose opening timestamp is closest to a calculated offset behind the current bar's opening time. The calculated offset represents the amount of time covered by the specified `period`. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
source (series float) : The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
period (series string) : The period string, which determines the calculated time offset. The specified argument must contain a unit and an optional multiplier (e.g., "1Y", "3M", "2W", "YTD"). Supported units are:
- "Y" for years.
- "M" for months.
- "W" for weeks.
- "D" for days.
- "YTD" (Year-to-date) for the span from the start of the current bar's year in the exchange time zone. An argument with this unit cannot contain a multiplier.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple containing the following data:
- The `source` value corresponding to the identified timestamp ("float").
- The earliest bar's timestamp that is closest to the calculated offset behind the current bar's opening time ("int").
- The current bar's `source` value ("float").
getDataAtTimes(timestamps, source, timeOffsetLimit, timeframeLimit)
Retrieves `source` and time information for each bar whose opening timestamp is the earliest one closest to one of the UNIX timestamps specified in the `timestamps` array. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
timestamps (array) : An array of "int" values representing UNIX timestamps. The function retrieves `source` and time data for each element in this array.
source (series float) : The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple of the following data:
- An array containing a `source` value for each identified timestamp (array).
- An array containing an identified timestamp for each item in the `timestamps` array (array).
- The current bar's `source` value ("float").
- The symbol's description from `syminfo.description` ("string").
getDataAtTimeOffsets(timeOffsets, source, timeOffsetLimit, timeframeLimit)
Retrieves `source` and time information for each bar whose opening timestamp is the earliest one closest to one of the time offsets specified in the `timeOffsets` array. Each offset in the array represents the absolute number of milliseconds behind the current bar's opening time. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
timeOffsets (array) : An array of "int" values representing the millisecond time offsets used in the search. The function retrieves `source` and time data for each element in this array. For example, the array ` ` specifies that the function returns data for the timestamps closest to one day and one week behind the current bar's opening time.
source (float) : (series float) The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple of the following data:
- An array containing a `source` value for each identified timestamp (array).
- An array containing an identified timestamp for each offset specified in the `timeOffsets` array (array).
- The current bar's `source` value ("float").
- The symbol's description from `syminfo.description` ("string").
getDataAtPeriodOffsets(periods, source, timeOffsetLimit, timeframeLimit)
Retrieves `source` and time information for each bar whose opening timestamp is the earliest one closest to a calculated offset behind the current bar's opening time. Each calculated offset represents the amount of time covered by a period specified in the `periods` array. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
periods (array) : An array of period strings, which determines the time offsets used in the search. The function retrieves `source` and time data for each element in this array. For example, the array ` ` specifies that the function returns data for the timestamps closest to one day, week, and month behind the current bar's opening time. Each "string" in the array must contain a unit and an optional multiplier. Supported units are:
- "Y" for years.
- "M" for months.
- "W" for weeks.
- "D" for days.
- "YTD" (Year-to-date) for the span from the start of the current bar's year in the exchange time zone. An argument with this unit cannot contain a multiplier.
source (float) : (series float) The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple of the following data:
- An array containing a `source` value for each identified timestamp (array).
- An array containing an identified timestamp for each period specified in the `periods` array (array).
- The current bar's `source` value ("float").
- The symbol's description from `syminfo.description` ("string").
52-Week & 5-Year High/Low with DatesThis indicator is designed to help traders quickly identify key price levels and their historical context by displaying the 52-week high/low and 5-year high/low prices along with their respective dates. It provides a clear visual representation of these levels directly on the chart and in a dashboard table for easy reference.
Key Features
52-Week High/Low:
Displays the highest and lowest prices over the last 252 trading days (approximately 52 weeks).
Includes the exact date when these levels were reached.
5-Year High/Low:
Displays the highest and lowest prices over the last 1260 trading days (approximately 5 years).
Includes the exact date when these levels were reached.
Visual Labels:
High and low levels are marked on the chart with labels that include the price and date.
Dashboard Table:
A table in the top-right corner of the chart summarizes the 52-week and 5-year high/low prices and their dates for quick reference.
Customizable Date Format:
Dates are displayed in the YYYY-MM-DD format for clarity and consistency.
Reversal Opportunity📌 Indicator Description – Reversal Opportunity 🎯
🔍 General Overview
The Reversal Opportunity indicator is designed to identify ideal conditions for Reversal Trading, but it does not provide trade entry signals. Instead, it helps traders determine whether the market conditions are favorable for a potential reversal.
It is specifically designed for traders who execute Reversal trades (Long or Short) and want a clear indication of whether the market is currently suitable for such setups.
💡 What does this indicator do?
- Identifies strong momentum before a reversal (a sharp upward or downward move).
- Detects momentum slowdown (decreasing volume and smaller candles).
- Checks if the RSI is at an extreme level (above 70 or below 30), indicating potential overbought or oversold conditions.
- Displays a table at the top center of the screen with the following key data:
- Are the conditions for a reversal met?
- Is there a slowdown in momentum?
- Is RSI at an extreme level?
- Was there strong uptrend momentum before a possible Short Reversal?
- Was there strong downtrend momentum before a possible Long Reversal?
⚙️ How Does the Indicator Work?
The indicator displays a table in the center of the screen, updating every 5 candles to indicate whether the market conditions are ideal for a reversal trade.
📊 Main Status Row:
- ✔ Ideal Reversal Setup → Conditions for a reversal trade are met (not a trade recommendation).
- ✖ Not Ideal → Reversal conditions are not met; it may be better to wait.
📌 Key Criteria Displayed in the Table:
1. ⚠️ Momentum Slowdown
- Yes → Momentum is weakening (a good sign for reversal trades).
- No → The market is still moving strongly, and a reversal might not be ready yet.
2. 📈 RSI Extreme
- Yes → RSI is above 70 (overbought) or below 30 (oversold), indicating a potential reversal.
- No → RSI is still in a normal range, suggesting that waiting for further confirmation might be wise.
3. 📊 Uptrend Momentum Before Reversal
- Yes → There was a strong uptrend over multiple consecutive candles, potentially setting up for a Short Reversal.
- No → No strong upward momentum was detected, meaning conditions for a Short Reversal may not be ideal.
4. 📉 Downtrend Momentum Before Reversal
- Yes → There was a strong downtrend over multiple consecutive candles, potentially setting up for a Long Reversal.
- No → No strong downward momentum was detected, meaning conditions for a Long Reversal may not be ideal.
🛠️ How to Use the Indicator?
- If "✔ Ideal Reversal Setup" appears, there is a high probability of a market reversal – use your personal entry strategy for further confirmation.
- If Momentum Slowdown = Yes, RSI Extreme = Yes, and strong momentum occurred beforehand, this is an ideal setup for a reversal trade.
- If any conditions are missing ("No"), it may be better to wait for further confirmation instead of entering too early.
- The indicator does NOT provide trade entries! Use your existing trading system for confirmation before entering a trade.
👥 Who Is This Indicator For?
- Reversal traders (entering against the current trend after a strong move).
- Intraday traders looking for reversal trades at extreme market levels.
- Technical traders who rely on Price Action and Volume for trade setups.
⚠️ Disclaimer:
This indicator does not recommend trade entries but provides insight into market conditions. The trader is responsible for risk management and decision-making.
It is best used in combination with additional confirmations such as reversal candles, Order Flow, Bookmap, or Volume Profile to improve accuracy.
🚀 The indicator is ready to use – add it to TradingView and get instant feedback on whether the market is ideal for a Reversal trade!
Dominant Smoothed Volume Pro Smoothed Volume Pro provides a useful tool designed to provide traders with a deeper understanding of market dynamics by analyzing buy and sell volume across multiple timeframes. Unlike traditional volume indicators, this script normalizes volume data from lower timeframes to align with the current chart's timeframe, providing an apples-to-apples comparison. The result is a visual histogram representation of the dominant buy or sell activity, smoothed over 5 different periods to reflect momentum shifts and enhance clarity.
Core Methodology
1. Multi-Timeframe Volume Analysis
This indicator leverages data from five different lower timeframes, each chosen dynamically based on the current chart's timeframe. By aggregating and normalizing these granular data points, the indicator captures subtle shifts in buy and sell volume that might otherwise go unnoticed. This multi-timeframe approach allows for a more detailed and accurate representation of market activity.
2. Data Normalization
Normalization is a critical component of this indicator. It ensures that volume data from lower timeframes is scaled appropriately to match the total volume of the current chart's timeframe. This step eliminates discrepancies caused by varying time intervals, providing a more meaningful comparison of volume trends across different periods.
3. Smoothing for Momentum Representation
The indicator employs five customizable smoothing factors to smooth out noisy volume data.
Each smoothing factor is distinctly color-coded in the histogram and table for intuitive analysis, helping traders quickly identify prevailing trends.
Features and Benefits
➖Customizable Smoothing Factors: Choose from five different smoothing factors, each with its unique settings for line styles, colors, and extensions.
➖Normalized Buy and Sell Volume: Displays normalized buy and sell volumes as a percentage of total activity, aiding in quick decision-making.
➖Visual Cues: Color-coded columns and labels help identify dominant trends at a glance, with high-opacity fills for visual clarity.
➖Dynamic Table: A built-in table summarizes smoothed volume data for each smoothing factor, offering a quick overview of bullish and bearish percentages.
➖Momentum Signals: Detect significant shifts in volume momentum with visually distinct alerts for high relative volumes, including special symbols like "⚡" and "🔥."
Practical Applications
➖Identifying Market Sentiment: Quickly determine whether the market is dominated by buyers or sellers at any given moment.
➖Spotting Reversals: Use momentum shifts in smoothed volume to anticipate potential trend reversals.
➖Enhancing Entry and Exit Points: Combine this indicator with other technical tools to refine entry and exit points in your trading strategy.
Why This Indicator Stands Out
Many existing volume indicators focus solely on raw or single-timeframe data, which can be misleading or incomplete. This indicator sets itself apart by:
Utilizing multi-timeframe data to provide a holistic view of market activity.
Applying robust normalization techniques to ensure data consistency.
Offering advanced smoothing options to emphasize actionable momentum signals.
This unique combination of features makes it an indispensable tool for traders seeking to enhance their market analysis and decision-making process.
As always, by combining the Smoothed Volume Pro with other tools, traders ensure that they are not relying on a single indicator. This layered approach can reduce the likelihood of false signals and improve overall trading accuracy.
Here's an additional visual representation using the plot fills:
MAG 7 - Weighted Multi-Symbol Momentum + ExtrasOverview
This indicator aggregates the percentage change of multiple symbols into a single “weighted momentum” value. You can set individual weights to emphasize or de-emphasize particular stocks. The script plots two key items:
The default tickers in the script are:
AAPL (Apple)
AMZN (Amazon)
NVDA (NVIDIA)
MSFT (Microsoft)
GOOGL (Alphabet/Google)
TSLA (Tesla)
META (Meta Platforms/Facebook)
Raw Weighted Momentum (Histogram):
Each bar represents the combined (weighted) percentage change across your chosen symbols for that bar.
Bars are colored green if the momentum is above zero, or red if below zero.
Smoothed Momentum (Yellow Line):
An Exponential Moving Average (EMA) of the raw momentum for a smoother trend view.
Helps visualize when short-term momentum is accelerating or decelerating relative to its average.
Features
Symbol Inputs: Up to seven user-defined tickers, with weights for each symbol.
Smoothing Period: Set a custom lookback length to calculate the EMA (or switch to SMA in the code if you prefer).
Table Display: A built-in table in the top-right corner lists each symbol’s real-time percentage change, plus the total weighted momentum.
Alerts:
Configure alerts for when the weighted momentum crosses above or below user-defined thresholds.
Helps you catch major shifts in sentiment across multiple symbols.
How To Use
Select Symbols & Weights: In the indicator’s settings, specify the tickers you want to monitor and their corresponding weights. Weights default to 1 (equal weighting).
Watch the Bars vs. Zero:
Bars above zero mean a positive weighted momentum (the basket is collectively moving up).
Bars below zero mean negative weighted momentum (the basket is collectively under pressure).
Check the Yellow Line: The EMA of momentum.
If the bars consistently stay above the line, short-term momentum is stronger than its recent average.
If the bars dip below the line, momentum is weakening relative to its average.
Review the Table: Quick snapshot of each symbol’s daily percentage change plus the total basket momentum, all color-coded red or green.
Caution & Tips
This indicator measures rate of change, not absolute price levels. A rising momentum can still be part of a larger downtrend.
Always combine momentum readings with other technical and/or fundamental signals for confirmation.
For better reliability, experiment with different smoothing lengths to suit your trading style (shorter for scalping, longer for swing or positional approaches).
ForecastPro by BinhMyco1. Overview:
This Pine Script implements a custom forecasting tool on TradingView, labeled "BinhMyco." It provides a method to predict future price movements based on historical data and a comparison with similar historical patterns. The script supports two types of forecasts: **Prediction** and **Replication**, where the forecasted price can be either based on price peaks/troughs or an average direction. The script also calculates a confidence probability, showing how closely the forecasted data aligns with historical trends.
2. Inputs:
- Source (`src`): The input data source for forecasting, which defaults to `open`.
- Length (`len`): The length of the training data used for analysis (fixed at 200).
- Reference Length (`leng`): A fixed reference length for comparing similar historical patterns (set to 70).
- Forecast Length (`length`): The length of the forecast period (fixed at 60).
- Multiplier (`mult`): A constant multiplier for the forecast confidence cone (set to 4.0).
- Forecast Type (`typ`): Type of forecast, either **Prediction** or **Replication**.
- Direction Type (`dirtyp`): Defines how the forecast is calculated — either based on price **peaks/troughs** or an **average direction**.
- Forecast Divergence Cone (`divcone`): A boolean option to enable the display of a confidence cone around the forecast.
3. Color Constants:
- Green (`#00ffbb`): Color used for upward price movements.
- Red (`#ff0000`): Color used for downward price movements.
- Reference Data Color (`refcol`): Blue color for the reference data.
- Similar Data Color (`simcol`): Orange color for the most similar data.
- Forecast Data Color (`forcol`): Yellow color for forecasted data.
4. Error Checking:
- The script checks if the reference length is greater than half the training data length, and if the forecast length exceeds the reference length, raising errors if either condition is true.
5. Arrays for Calculation:
- Correlation Array (`c`): Holds the correlation values between the data source (`src`) and historical data points.
- Index Array (`index`): Stores the indices of the historical data for comparison.
6. Forecasting Logic:
- Correlation Calculation: The script calculates the correlation between the historical data (`src`) and the reference data over the given reference length. It then identifies the point in history most similar to the current data.
- Forecast Price Calculation: Based on the type of forecast (Prediction or Replication), the script calculates future prices either by predicting based on similar bars or by replicating past data. The forecasted prices are stored in the `forecastPrices` array.
- Forecast Line Drawing: The script draws lines to represent the forecasted price movements. These lines are color-coded based on whether the forecasted price is higher or lower than the current price.
7. Divergence Cone (Optional):
- If the **divcone** option is enabled, the script calculates and draws a confidence cone around the forecasted prices. The upper and lower bounds of the cone are calculated using a standard deviation factor, providing a visual representation of forecast uncertainty.
8. Probability Table:
- A table is displayed on the chart, showing the probability of the forecast being accurate. This probability is calculated using the correlation between the current data and the most similar historical pattern. If the probability is positive, the table background turns green; if negative, it turns red. The probability is presented as a percentage.
9. Key Functions:
- `highest_range` and `lowest_range`: Functions to find the highest and lowest price within a range of bars.
- `ftype`: Determines the forecast type (Prediction or Replication) and adjusts the forecasting logic accordingly.
- `ftypediff`: Computes the difference between the forecasted and actual prices based on the selected forecast type.
- `ftypelim`, `ftypeleft`, `ftyperight`: Additional functions to adjust the calculation of the forecast based on the forecast type.
10. Conclusion:
The "ForecastPro" script is a unique tool for forecasting future price movements on TradingView. It compares historical price data with similar historical trends to generate predictions. The script also offers a customizable confidence cone and displays the probability of the forecast's accuracy. This tool provides traders with valuable insights into future price action, potentially enhancing decision-making in trading strategies.
---
This script provides advanced functionality for traders who wish to explore price forecasting, and can be customized to fit various trading styles.
Intrabar BoxPlotThe Intrabar BoxPlot publication highlights an uncommon technique by displaying statistical intrabar Lower Timeframe (LTF) values on the chart.
🔶 USAGE
🔹 Middle 50% Boxes
By showing the middle 50% intrabar values through a box, we can more easily see where the intrabar activity is mainly situated.
The middle 50% intrabar values are referred to from here on as Interquartile range (IQR).
In this example, the successive IQRs form a channel where the price eventually breaks out.
Disproportionately distributed values can give insights which can be used to find potential support/resistance areas.
IQR gaps can give valuable information as well. Potentially, the price can return to these gaps.
Seeing the IQR areas against regular candles gives an alternative image of the underlying price movements.
🔹 Highest volume Price level
The script displays the price level with the highest volume situated, dependable on the user's source setting. Setting the source at 'close' will only display intrabar close values; the same goes for high, low, ...
As seen in the above example, the volume levels can aid in finding support/resistance.
🔹 Median
The location of the median off all intrabar values is displayed as a coloured dot: green when the close price is higher than the opening price and red if otherwise. The median can give valuable insights into price movements.
🔹 Outliers
Medium (white dots) and extreme (white X) outliers, in combination with the IQR box, can help identify potential areas of interest.
🔹 Volume Delta
When there is a discrepancy between the delta volume and direction of the candle, this will be displayed as follows:
Green candle: when the sum of the volume of red intrabars is higher than the sum of the volume of green intrabars, the candle will be coloured orange.
Red candle: when the sum of the volume of green intrabars is higher than the sum of the volume of red intrabars, the candle will be coloured blue.
🔹 Highlight Boxplot only
Probably the easiest way to display boxplot only is by changing the Bar's style to Bars .
🔶 DETAILS
All intrabar values (Lower TimeFrame - LTF) are sorted and evaluated. Values can be close , high , low , ... by selecting this in Settings ( source ).
The middle 50% of all values are displayed as a box; this contains the values between percentile 25 (p25) and percentile 75 (p75). The value of percentile rank 75 means 75% of all values are lower. The value of percentile rank 25 means 25% of all values are lower, or 75% is higher.
The difference between p75 and p25 is also known as Interquartile range (IQR)
IQR is used to check for outliers.
Wiki: Boxplot , Interquartile range
Extreme high: maximum value, higher than p75 + IQR*3
Max outlier high: maximum value, higher than p75 + IQR*1.5 but lower than p75 + IQR*3
Max: maximum value, lower than p75 + IQR*1.5
Min: minimum value, higher than p25 - IQR*1.5
Min outlier low: minimum value, lower than p25 - IQR*1.5 but higher than p25 - IQR*3
Extreme low: minimum value, lower than p25 - IQR*3
Max and min must not be interpreted with the current candle high/low.
🔹 Example: Length of chart-puppets
The following example can make it easier to digest. Forty "chart-puppets" are sorted by their length.
The p25 value is 97
The p50 value is 120
The p75 value is 149
75% of all "chart-puppets" are smaller than p75, and 25% is larger than p75.
50% of all "chart-puppets" are smaller than p50, and 50% is larger than p50 (= median).
25% of all "chart-puppets" are smaller than p25, and 75% is larger than p25.
IQR = 149 - 97 = 52
Extreme outlier limit max: p75 + IQR*3 = 149 + 52*3 = 305
Mild outlier limit max: p75 + IQR*1.5 = 149 + 52*1.5 = 227
Mild outlier limit min: p25 - IQR*1.5 = 97 - 52*1.5 = 19
Extreme outlier limit min: p25 - IQR*3 = 97 - 52*3 = -59
In this example there are no outliers to be found, all values are located between p25 - IQR*1.5 (19) and p75 + IQR*1.5. (227)
🔹 Source settings
Note that results are dependable on the chosen source (settings). When, for example, close is chosen as the source, only intrabar close prices are included. This means a low or high can stretch further then the min or max.
Here we can see different results with different source settings
🔹 LTF settings
When 'Auto' is enabled (Settings, LTF), the LTF will be the nearest possible x times smaller TF than the current TF. When 'Premium' is disabled, the minimum TF will always be 1 minute to ensure TradingView plans lower than Premium don't get an error.
Examples with current Daily TF (when Premium is enabled):
500 : 3 minute LTF
1500 (default): 1 minute LTF
5000: 30 seconds LTF (1 minute if Premium is disabled)
🔶 SETTINGS
Source: Set source at close, high, low,...
🔹 LTF
LTF: LTF setting
Auto + multiple: Adjusts the initial set LTF
Premium: Enable when your TradingView plan is Premium or higher
🔹 Intrabar Delta : Colors, dependable on different circumstances.
Up: Price goes up, with more bullish than bearish intrabar volume.
Up-: Price goes up, with more bearish than bullish intrabar volume.
Down: Price goes down, with more bearish than bullish intrabar volume.
Down+: Price goes down, with more bullish than bearish intrabar volume.
🔹 Table
Show table: Show details at the top right corner
Show TF: Show LTF at the bottom right corner
Text color/table size
See DETAILS for more information
ATR/DTR with Custom Percentage DisplayThis Pine Script indicator provides a detailed view of the Average True Range (ATR) and Daily True Range (DTR), along with additional calculated metrics to assist in analyzing price volatility. The key features of the indicator include:
ATR Calculation:
The ATR is calculated over a user-defined timeframe, allowing traders to assess average market volatility over a specific period.
DTR Calculation:
The DTR represents the absolute range (high - low) of the current or chosen timeframe, providing insights into the day's price movement.
ATR/DTR Percentage:
This metric calculates the DTR as a percentage of the ATR, showing how the daily range compares to the average range, with dynamic coloring to highlight when it exceeds a user-defined threshold.
Custom Percentage of ATR:
Users can input a custom percentage to calculate and display a corresponding value of the ATR. For example, entering 15% will compute and display 15% of the ATR in the indicator’s table.
Dynamic Table Display:
The indicator outputs all these metrics in a well-organized table that is overlaid on the chart. The table includes:
ATR
DTR
ATR/DTR percentage
The user-defined percentage of ATR
Customizable Features:
Color Coding: The table dynamically changes its background color when the ATR/DTR percentage exceeds a user-defined threshold.
Placement Options: The table's position on the chart can be adjusted (e.g., bottom-right, top-center) for optimal visibility.
Use Case:
This indicator is ideal for traders who want a deeper understanding of market volatility and prefer visual representation of how current price movements compare to historical averages. It is especially useful for:
Setting volatility-based stop-loss levels.
Identifying high-volatility trading opportunities.
Tailoring strategies around price movement patterns.
Forex Heatmap█ OVERVIEW
This indicator creates a dynamic grid display of currency pair cross rates (exchange rates) and percentage changes, emulating the Cross Rates and Heat Map widgets available on our Forex page. It provides a view of realtime exchange rates for all possible pairs derived from a user-specified list of currencies, allowing users to monitor the relative performance of several currencies directly on a TradingView chart.
█ CONCEPTS
Foreign exchange
The Foreign Exchange (Forex/FX) market is the largest, most liquid financial market globally, with an average daily trading volume of over 5 trillion USD. Open 24 hours a day, five days a week, it operates through a decentralized network of financial hubs in various major cities worldwide. In this market, participants trade currencies in pairs , where the listed price of a currency pair represents the exchange rate from a given base currency to a specific quote currency . For example, the "EURUSD" pair's price represents the amount of USD (quote currency) that equals one unit of EUR (base currency). Globally, the most traded currencies include the U.S. dollar (USD), Euro (EUR), Japanese yen (JPY), British pound (GBP), and Australian dollar (AUD), with USD involved in over 87% of all trades.
Understanding the Forex market is essential for traders and investors, even those who do not trade currency pairs directly, because exchange rates profoundly affect global markets. For instance, fluctuations in the value of USD can impact the demand for U.S. exports or the earnings of companies that handle multinational transactions, either of which can affect the prices of stocks, indices, and commodities. Additionally, since many factors influence exchange rates, including economic policies and interest rate changes, analyzing the exchange rates across currencies can provide insight into global economic health.
█ FEATURES
Requesting a list of currencies
This indicator requests data for every valid currency pair combination from the list of currencies defined by the "Currency list" input in the "Settings/Inputs" tab. The list can contain up to six unique currency codes separated by commas, resulting in a maximum of 30 requested currency pairs.
For example, if the specified "Currency list" input is "CAD, USD, EUR", the indicator requests and displays relevant data for six currency pair combinations: "CADUSD", "USDCAD", "CADEUR", "EURCAD", "USDEUR", "EURUSD". See the "Grid display" section below to understand how the script organizes the requested information.
Each item in the comma-separated list must represent a valid currency code. If the "Currency list" input contains an invalid currency code, the corresponding cells for that currency in the "Cross rates" or "Heat map" grid show "NaN" values. If the list contains empty items, e.g., "CAD, ,EUR, ", the indicator ignores them in its data requests and calculations.
NOTE: Some uncommon currency pair combinations might not have data feeds available. If no available symbols provide the exchange rates between two specified currencies, the corresponding table cells show "NaN" results.
Realtime data
The indicator retrieves realtime market prices, daily price changes, and minimum tick sizes for all the currency pairs derived from the "Currency list" input. It updates the retrieved information shown in its grid display after new ticks become available to reflect the latest known values.
NOTE: Pine scripts execute on realtime bars only when new ticks are available in the chart's data feed. If no new updates are available from the chart's realtime feed, it may cause a delay in the data the indicator receives.
Grid display
This indicator displays the requested data for each currency pair in a table with cells organized as a grid. Each row name corresponds to a pair's base currency , and each column name corresponds to a quote currency . The cell at the intersection of a specific row and column shows the value requested from the corresponding currency pair.
For example, the cell at the intersection of a "EUR" row and "USD" column shows the data retrieved for the "EURUSD" currency pair, and the cell at the "USD" row and "EUR" column shows data for the inverse pair ("USDEUR").
Note that the main diagonal cells in the table, where rows and columns with the same names intersect, are blank. The exchange rate from one currency to itself is always 1, and no Forex symbols such as "EUREUR" exist.
The dropdown input at the top of the "Settings/Inputs" tab determines the type of information displayed in the table. Two options are available: "Cross rates" and "Heat map" . Both modes color their cells for light and dark themes separately based on the inputs in the "Colors" section.
Cross rates
When a user selects the "Cross rates" display mode, the table's cells show the latest available exchange rate for each currency pair, emulating the behavior of the Cross Rates widget. Each cell's value represents the amount of the quote currency (column name) that equals one unit of the base currency (row name). This display allows users to compare cross rates across currency pairs, and their inverses.
The background color of each cell changes based on the most recent update to the exchange rate, allowing users to monitor the direction of short-term fluctuations as they occur. By default, the background turns green (positive cell color) when the cross rate increases from the last recorded update and red (negative cell color) when the rate decreases. The cell's color reverts to the chart's background color after no new updates are available for 200 milliseconds.
Heat map
When a user selects the "Heat map" display mode, the table's cells show the latest daily percentage change of each currency pair, emulating the behavior of the Heat Map widget.
In this mode, the background color of each cell depends on the corresponding currency pair's daily performance. Heat maps typically use colors that vary in intensity based on the calculated values. This indicator uses the following color coding by default:
• Green (Positive cell color): Percentage change > +0.1%
• No color: Percentage change between 0.0% and +0.1%
• Bright red (Negative cell color): Percentage change < -0.1%
• Lighter/darker red (Minor negative cell color): Percentage change between 0.0% and -0.1%
█ FOR Pine Script™ CODERS
• This script utilizes dynamic requests to iteratively fetch information from multiple contexts using a single request.security() instance in the code. Previously, `request.*()` functions were not allowed within the local scopes of loops or conditional structures, and most `request.*()` function parameters, excluding `expression`, required arguments of a simple or weaker qualified type. The new `dynamic_requests` parameter in script declaration statements enables more flexibility in how scripts can use `request.*()` calls. When its value is `true`, all `request.*()` functions can accept series arguments for the parameters that define their requested contexts, and `request.*()` functions can execute within local scopes. See the Dynamic requests section of the Pine Script™ User Manual to learn more.
• Scripts can execute up to 40 unique `request.*()` function calls. A `request.*()` call is unique only if the script does not already call the same function with the same arguments. See this section of the User Manual's Limitations page for more information.
• Typically, when requesting higher-timeframe data with request.security() using barmerge.lookahead_on as the `lookahead` argument, the `expression` argument should use the history-referencing operator to offset the series, preventing lookahead bias on historical bars. However, the request.security() call in this script uses barmerge.lookahead_on without offsetting the `expression` because the script only displays results for the latest historical bar and all realtime bars, where there is no future information to leak into the past. Instead, using this call on those bars ensures each request fetches the most recent data available from each context.
• The request.security() instance in this script includes a `calc_bars_count` argument to specify that each request retrieves only a minimal number of bars from the end of each symbol's historical data feed. The script does not need to request all the historical data for each symbol because it only shows results on the last chart bar that do not depend on the entire time series. In this case, reducing the retrieved bars in each request helps minimize resource usage without impacting the calculated results.
Look first. Then leap.
Portfolio SnapShot v0.3Here is a Tradingview Pinescript that I call "Portfolio Snapshot". It is based on two other separate scripts that I combined, modified and simplified - shoutout to RedKTrader (Portfolio Tracker - Table Version) and FriendOfTheTrend (Portfolio Tracker For Stocks & Crypto) for their inspiration and code. I was using both of these scripts, and decided to combine the two and increase the number of stocks to 20. I was looking for an easy way to track my entire portfolio (scattered across 5 accounts) PnL on a total and stock basis. PnL - that's it, very simple by design. The features are:
1) Track PnL across multiple accounts, from inception and current day.
2) PnL is reported in two tables, at the portfolio level and individual stock level
3) Both tables can be turned on/off and placed anywhere on the chart.
4) Input up to 20 assets (stocks, crypto, ETFs)
The user has to manually calculate total shares and average basis for stocks in multiple accounts, and then inputs this in the user input dialog. I update mine as each trade is made, or you can just update once a week or so.
I've pre-loaded it with the major indices and sector ETFs, plus URA, GLD, SLV. 100 shares of each, and prices are based on the close Jan 2 2024. So if you don't want to track your portfolio, you can use it to track other things you find interesting, such as annual performance of each sector.
MTF RSI+CMO PROThis RSI+CMO script combines the Relative Strength Index (RSI) and Chande Momentum Oscillator (CMO), providing a powerful tool to help traders analyze price momentum and spot potential turning points in the market. Unlike using RSI alone, the CMO (especially with a 14-period length) moves faster and accentuates price pops and dips in the histogram, making price shifts more apparent.
Indicator Features:
➡️RSI and CMO Combined: This indicator allows traders to track both RSI and CMO values simultaneously, highlighting differences in their movement. RSI and CMO values are both plotted on the histogram, while CMO values are also drawn as a line moving through the histogram, giving a visual representation of their relationship. The often faster-moving CMO accentuates short-term price movements, helping traders spot subtle shifts in momentum that the RSI might smooth out.
➡️Multi-Time Frame Table: A real-time, multi-time frame table displays RSI and CMO values across various timeframes. This gives traders an overview of momentum across different intervals, making it easier to spot trends and divergences across short and long-term time frames.
➡️Momentum Chart Label: A chart label compares the current RSI and CMO values with values from 1 and 2 bars back, providing an additional metric to gauge momentum. This feature allows traders to easily see if momentum is increasing or decreasing in real-time.
➡️RSI/CMO Bullish and Bearish Signals: Colored arrow plot shapes (above the histogram) indicate when RSI and CMO values are signaling bullish or bearish conditions. For example, green arrows appear when RSI is above 65, while purple arrows show when RSI is below 30 and CMO is below -40, indicating strong bearish momentum.
➡️Divergences in Histogram: The histogram can make it easier for traders to spot divergences between price and momentum. For instance, if the price is making new highs but the RSI or CMO is not, a bearish divergence may be forming. Similarly, bullish divergences can be spotted when prices are making lower lows while RSI or CMO is rising.
➡️Alert System: Alerts are built into the indicator and will trigger when specific conditions are met, allowing traders to stay informed of potential entry or exit points based on RSI and CMO levels without constantly monitoring the chart. These are set manually. Look for the 3 dots in the indicator name.
How Traders Can Use the Indicator:
💥Identifying Momentum Shifts: The RSI+CMO combination is ideal for spotting momentum shifts in the market. Traders can monitor the histogram and the CMO line to determine if the market is gaining or losing strength.
💥Confirming Trade Entries/Exits: Use the real-time RSI and CMO values across multiple time frames to confirm trades. For instance, if the 1-hour RSI is above 70 but the 1-minute RSI is turning down, it could indicate short-term overbought conditions, signaling a potential exit or reversal.
💥Spotting Divergences: Divergences are critical for predicting potential reversals. The histogram can be used to spot divergences when RSI and CMO values deviate from price action, offering an early signal of market exhaustion.
💥Tracking Multi-Time Frame Trends: The multi-time frame table provides insight into the market’s overall trend across several timeframes, helping traders ensure their decisions align with both short and long-term trends.
RSI vs. CMO: Why Use Both?
While both RSI and CMO measure momentum, the CMO often moves faster with a value of 14 for example, reacting to price changes more quickly. This makes it particularly effective for detecting sharp price movements, while RSI helps smooth out price action. By using both, traders get a clearer picture of the market's momentum, particularly during volatile periods.
Confluence and Price Fluidity:
One of the powerful ways to enhance the effectiveness of this indicator is by using it in conjunction with other technical analysis tools to create confluence. Confluence occurs when multiple indicators or price action signals align, providing stronger confirmation for a trade decision. For example:
🎯Support and Resistance Levels: Traders can use RSI+CMO in combination with key support and resistance zones. If the price is nearing a support level and RSI+CMO values start to signal a bullish reversal, this alignment strengthens the case for entering a long position.
🎯Moving Averages: When the RSI+CMO signals a potential trend reversal and this is confirmed by a crossover in moving averages (such as a 50-day and 200-day moving average), traders gain additional confidence in the trade direction.
🎯Momentum Indicators: Traders can also look for momentum indicators like the MACD to confirm the strength of a trend or potential reversal. For instance, if the RSI+CMO values start to decrease rapidly while both the RSI+CMO also shows overbought conditions, this could provide stronger confirmation to exit a long trade or enter a short position.
🎯Candlestick Patterns: Price fluidity can be monitored using candlestick formations. For example, a bearish engulfing pattern with decreasing RSI+CMo values offers confluence, adding confidence to the signal to close or short the trade.
By combining the MTF RSI+CMO PRO with other tools, traders ensure that they are not relying on a single indicator. This layered approach can reduce the likelihood of false signals and improve overall trading accuracy.
NYSE UVOL RatioThis Pine Script is designed to monitor and display the ratio of advancing volume (UVOL) to declining volume (DVOL) on the NYSE in real-time on your TradingView charts. Here's a breakdown of what each part of the script does:
Indicator Declaration: The script starts by declaring an indicator called "NYSE UVOL" with the option to overlay it directly on the price chart. This allows you to see the volume ratio in context with price movements.
Volume Data Fetching:
Advancing Volume (UVOL): It retrieves the closing value of the advancing volume from the NYSE.
Declining Volume (DVOL): It fetches the closing value of the declining volume.
Ratio Calculation:
The script calculates the ratio of advancing to declining volume. To avoid division by zero, it checks if the declining volume is not zero before performing the division.
Color Coding:
The script assigns a color to the ratio value based on set thresholds:
Red for a ratio less than 1 (more declining than advancing volume).
White for ratios between 1 and 2.
Lime for ratios between 2 and 3.
Green for ratios above 3.
Display Table:
A table is created in the top-right corner of the chart to display the current ratio value.
It updates this table with the latest ratio value at each new bar, displaying the ratio with appropriate color coding for quick reference.
This script provides a visual and numerical representation of market sentiment based on volume data, aiding traders in assessing the balance between buying and selling pressure.